#include <head.h>

#define Tab_name "log_in"

// 初始化
sqlite3 *sqlite3_init_log_in(void);

// 插入
void Insert_INTO_log_in(sqlite3 *sql);

// 删除
void Delete_FROM_log_in(sqlite3 *sql);

// 查找
void Select_FROM_log_in(sqlite3 *sql);

// 修改
void Updata_SET_log_in(sqlite3 *sql);

// 回调函数
int callback(void *data, int argc, char **argv, char **azColName);

int main(int argc, char const *argv[])
{
    // 创建表
    sqlite3 *sql_log_in = sqlite3_init_log_in();
    while (1)
    {
        printf("1、增加学生信息 2、删除学生信息 3、查找学生信息 4、修改学生信息 5、退出\n");

        int sw_num;

        scanf("%d", &sw_num);

        switch (sw_num)
        {
        case 1: // 增加
            Insert_INTO_log_in(sql_log_in);
            break;
        case 2: // 删除
            Delete_FROM_log_in(sql_log_in);
            break;
        case 3: // 查找
            Select_FROM_log_in(sql_log_in);
            break;
        case 4: // 修改
            Updata_SET_log_in(sql_log_in);
            break;
        case 5:
            sqlite3_close(sql_log_in);
            return 0;
        default:
            printf("输入错误\n");
            break;
        }
    }

    sqlite3_close(sql_log_in);

    return 0;
}

sqlite3 *sqlite3_init_log_in(void)
{
    // 打开数据库
    int sqlite_Errnum = 0;
    sqlite3 *sqlite3_log_in;
    char *errmsg;

    sqlite_Errnum = sqlite3_open("log_in.db", &sqlite3_log_in);
    if (SQLITE_OK != sqlite_Errnum)
    {
        printf("sqlite3_open : errnum:[%d] errstr:[%s]\n", sqlite_Errnum, sqlite3_errmsg(sqlite3_log_in));
        exit(-1);
    }

    printf("打开成功\n");

    // 建立表

    char sql_cmd[128];

    sprintf(sql_cmd, "CREATE TABLE IF NOT EXISTS %s (id INTEGER PRIMARY KEY AUTOINCREMENT , User CHAR(64), password CHAR(64))", Tab_name);
    // INTEGER PRIMARY KEY AUTOINCREMENT 从 1 开始自增
    // IF NOT EXISTS 当有表格时 不会报错
    sqlite_Errnum = sqlite3_exec(sqlite3_log_in, sql_cmd, NULL, NULL, &errmsg);
    if (SQLITE_OK != sqlite_Errnum)
    {
        printf("sqlite3_exec : errnum:[%d] errstr:[%s]\n", sqlite_Errnum, errmsg);
        sqlite3_close(sqlite3_log_in);
        sqlite3_free(errmsg);
        exit(-1);
    }

    // 释放报错信息
    sqlite3_free(errmsg);

    return sqlite3_log_in;
}

// 插入
void Insert_INTO_log_in(sqlite3 *sql)
{
    // 用户名
    char user[64];
    // 密码
    char password[64];
    // 数据库错误码
    int sql_err_num;
    // 数据库错误信息
    char *sql_err_str;
    // 数据库命令
    char sql_cmd[1024];

    // 用户输入 插入的信息
    printf("请输入用户名:");
    scanf("%63s", user);
    printf("请输入用户密码:");
    scanf("%63s", password);

    // 命令组装
    snprintf(sql_cmd, sizeof(sql_cmd), "INSERT INTO %s (User, password) VALUES ('%s' , '%s')",
             Tab_name, user, password);

    // 执行命令
    sql_err_num = sqlite3_exec(sql, sql_cmd, NULL, NULL, &sql_err_str);
    if (SQLITE_OK != sql_err_num)
    {
        printf("插入错误 : errnum:[%d] errstr:[%s]\n", sql_err_num, sql_err_str);
        sqlite3_free(sql_err_str);
        return;
    }

    printf("插入成功\n");

    return;
}

// 删除
void Delete_FROM_log_in(sqlite3 *sql)
{
    // 用户id
    int id;
    // 数据库错误码
    int sql_err_num;
    // 数据库错误信息
    char *sql_err_str;
    // 数据库命令
    char sql_cmd[1024];

    // 输入用户id
    printf("请输入要删除的ID:");
    scanf("%d", &id);

    // 组装命令 DELETE FROM log_in WHERE id = 1001;
    snprintf(sql_cmd, sizeof(sql_cmd), "DELETE FROM %s WHERE id = %d",
             Tab_name, id);

    // 执行命令
    sql_err_num = sqlite3_exec(sql, sql_cmd, NULL, NULL, &sql_err_str);
    if (SQLITE_OK != sql_err_num)
    {
        printf("插入错误 : errnum:[%d] errstr:[%s]\n", sql_err_num, sql_err_str);
        sqlite3_free(sql_err_str);
        return;
    }

    printf("删除成功\n");

    return;
}

// 查找
void Select_FROM_log_in(sqlite3 *sql)
{

    // 用户id
    int id;
    // 数据库错误码
    int sql_err_num;
    // 数据库错误信息
    char *sql_err_str;
    // 数据库命令
    char sql_cmd[1024];
    // 是否有数据
    int is = 0;

    // 输入用户id
    printf("请输入要删除的ID:");
    scanf("%d", &id);


    // 组装命令 SELECT * FROM 表名 WHERE 条件;
    snprintf(sql_cmd, sizeof(sql_cmd), "SELECT * FROM %s WHERE id = %d",
             Tab_name , id);

    // 执行命令
    sql_err_num = sqlite3_exec(sql, sql_cmd, callback , (void *)&is , &sql_err_str);
    if (SQLITE_OK != sql_err_num)
    {
        printf("插入错误 : errnum:[%d] errstr:[%s]\n", sql_err_num, sql_err_str);
        sqlite3_free(sql_err_str);
        return;
    }
    if (is == 1)
    {
        printf("找到了\n");
        return;
    }
    printf("没找到\n");
}

// 修改
void Updata_SET_log_in(sqlite3 *sql)
{
    // 用户名
    char user[64];
    // 密码
    char password[64];
    // 用户id
    int id;
    // 数据库错误码
    int sql_err_num;
    // 数据库错误信息
    char *sql_err_str;
    // 数据库命令
    char sql_cmd[1024];
    // 是否有数据
    int is = 0;

    // 输入用户id
    printf("请输入要修改的ID:");
    scanf("%d", &id);

    // 用户输入 修改的信息
    printf("请输入用户名:");
    scanf("%63s", user);

    printf("请输入用户密码:");
    scanf("%63s", password);

    // 组装命令 UPDATE 表名 SET 字段名 = 新值 WHERE 条件;
    snprintf(sql_cmd, sizeof(sql_cmd), "UPDATE %s SET User = '%s' , password = '%s'  WHERE id = %d",
             Tab_name, user  , password , id);

    // 执行命令 
    sql_err_num = sqlite3_exec(sql, sql_cmd, callback, (void *)&is, &sql_err_str);
    if (SQLITE_OK != sql_err_num)
    {
        printf("插入错误 : errnum:[%d] errstr:[%s]\n", sql_err_num, sql_err_str);
        sqlite3_free(sql_err_str);
        return;
    }
}

// 回调函数
int callback(void *data, int argc, char **argv, char **azColName)
{
    for (int i = 0; i < argc; i++)
    {
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
        *((int *)data) = 1;
    }
    printf("\n");
    return 0;
}
